import math

# st 表初始化函数，用于构建 st 表以处理区间最大值查询
# st 表中，i 表示区间的起点，j 表示区间长度为 2^j
# 递推公式为 st[i][j] = max(st[i][j - 1], st[i + 2^(j - 1)][j - 1])
def st_init(a):
    # 获取数组 a 的长度
    n = len(a)
    # 计算 st 表中 j 的最大值，使得 2^j <= n
    # 这里加 1 是为了确保能覆盖所有可能的区间长度
    k = int(math.log2(n)) + 1
    # 初始化 st 表，它是一个二维数组，大小为 n 行 k 列
    # 初始值都设为 0，后续会根据数组 a 的值进行更新
    st = [[0] * k for _ in range(n)]

    # 当 j = 0 时，区间长度为 2^0 = 1
    # 此时 st[i][0] 就等于数组 a 中第 i 个元素的值
    for i in range(n):
        st[i][0] = a[i]

    # 使用动态规划的方法递推填充 st 表
    # 先确定区间长度 2^j，再遍历不同的起点 i
    for j in range(1, k):
        # 计算 2^(j - 1)，避免在后续循环中重复计算
        pr = 2 ** (j - 1)
        # 遍历起点 i，范围要保证不会越界
        # 因为区间长度为 2^j，所以起点 i 最大只能到 n - 2^(j - 1) - 1
        for i in range(n - pr):
            # 根据递推公式更新 st[i][j] 的值
            # 即取两个长度为 2^(j - 1) 的子区间的最大值
            st[i][j] = max(st[i][j - 1], st[i + 2 ** (j - 1)][j - 1])
    # 返回构建好的 st 表
    return st

# 查询函数，用于查询指定区间 [l, r] 的最大值
def query(st, l, r):
    # 计算满足 2^k <= r - l + 1 的最大 k 值
    # 这个 k 值用于将区间 [l, r] 拆分成两个长度为 2^k 的子区间
    k = int(math.log2(r - l + 1))
    # 区间 [l, r] 的最大值可以由两个长度为 2^k 的子区间的最大值得到
    # 一个子区间从 l 开始，另一个子区间从 r - 2^k + 1 开始
    return max(st[l][k], st[r - (1 << k) + 1][k])

# 读取输入，n 表示数组的长度，m 表示查询的次数
n, m = map(int, input().split())
# 读取数组 a 的元素
a = list(map(int, input().split()))
# 调用 st_init 函数对数组 a 进行预处理，得到 st 表
st = st_init(a)

# 进行 m 次查询
for _ in range(m):
    # 读取每次查询的区间 [l, r]
    l, r = map(int, input().split())
    # 由于输入的区间下标通常从 1 开始，而代码中数组下标从 0 开始
    # 所以要将 l 和 r 都减 1
    print(query(st, l - 1, r - 1))